Parallel processing is a computational approach that breaks a large computational requirement into a group of smaller computations for concurrent resolution across the computer's processing resources. A computer that uses task parallelism divides the large requirement into tasks that contain segments of executable code. The tasks are then executed concurrently or sequentially according to their needs, until the large requirement has been fully processed. In a multiprocessor system, the computer includes a central processing unit (“CPU”) that is tasked with performing the large requirement. The CPU divides the requirement into tasks and distributes the tasks to co-processors. Completed threads are reported to the CPU, which continues to distribute threads until the primary processing is complete.
This typical multiprocessing framework suffers from two major drawbacks, both caused by the architectural requirement that the CPU divide and distribute the threads. First, a significant amount of the CPU's processing time is consumed in managing the co-processing tasks. The management may include: distributing the tasks, in sequential order when needed, to co-processors according to their capabilities; waiting for tasks to be completed before distributing result-dependent threads; responding to interrupts from co-processors every time a task is completed; and responding to other messages from co-processors. Second, a co-processor will remain idle as it waits for a thread to be assigned to it by the CPU. A multiprocessor system that alleviates the management workload on the CPU while keeping the co-processors busy is needed.
Therefore, it is an object of this invention to provide an apparatus and method for parallel processing in a multiprocessor system using co-processors that proactively seek threads to process. It is a further object that the co-processors be capable of acting autonomously. It is a further object that the co-processors include an agent that searches a task pool to acquire tasks for the co-processors to perform. It is a further object that the co-processors work in solidarity to complete a large computational requirement by processing threads and subtasks.